const obj = {};
Object.defineProperty(obj, "key", {
  value: 10,
  writable: true,
  enumerable: true,
  configurable: true
});
obj.key = 12;
console.log(obj);
/* 结果
{
    "key": 12
}
*/

Object.defineProperty(obj, "value", {
  value: "lucy",
  writable: false,
  enumerable: true,
  configurable: true
});
obj.value = "jam"; // 这行不生效，不可写，即：修改
console.log(obj);
/* 结果
{
  "key": 12,
  "value": "lucy"
}
*/

Object.defineProperty(obj, "grade", {
  value: "A",
  writable: true,
  enumerable: false,
  configurable: true
});
console.log(obj);
for(let key in obj) {
  console.log(key);
}
/* 输出结果
  key
  value
  // 由于grade不可枚举，因此不会打印出来
*/
console.log(Object.keys(obj));
/* 输出结果
[
  "key",
  "value"
]
*/

// const obj1 = {};
// Object.defineProperty(obj1, "key", {
//   value: "haha",
//   configurable: false
// });
// // Object.defineProperty(obj1, "key", {
// //   value: "haha",
// //   configurable: true
// // }); //直接报错
// // Object.defineProperty(obj1, "key", {
// //   value: "haha1",
// //   enumerable: true
// // }); //直接报错

// const obj2 = {};
// Object.defineProperty(obj2, "name", {
//   get() {
//     return "想获取名称？没门!";
//   },
//   set(val) {
//     console.log(`想把名称该为${val}?没门!`);
//   }
// });
// console.log(obj2.name); // 想获取名称？没门!
// obj2.name = "古政"; // 想把名称该为古政?没门!

const obj3 = {};
var value = 18;
Object.defineProperty(obj3, "age", {
  get() {
    return value;
  },
  set(newVal) {
    value = newVal;
  }
});
console.log(obj3.age); // 18
obj3.age = 22; // 修改成功
console.log(obj3.age); // 22

const obj4 = {
  age: 18
};
var value = obj4.age;
Object.defineProperty(obj4, "age", {
  get() {
    return value;
  },
  set(newVal) {
    value = newVal;
  }
});
console.log(obj4.age); // 18
obj4.age = 22; // 修改成功
console.log(obj4.age); // 22
